From bc70813814bf808d64f0331c2e450662058e07a7 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 8 Dec 2005 15:21:36 +0100 Subject: [PATCH] Don't unshadow when the shadow l2 is the current used shadow table. Otherwise, when destroying the domain, if the current sl2 is unpinned then the shadow page will be freed without accquire the shadow_lock. This may also improve the performance due to avoiding uncessary unshadow. Signed-off-by: Xiaofeng Ling --- xen/arch/x86/shadow.c | 4 ++++ xen/arch/x86/shadow32.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index d6c052428e..c8a9f1eb02 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -1450,6 +1450,7 @@ static int resync_all(struct domain *d, u32 stype) int changed; u32 min_max_shadow, min_max_snapshot; int min_shadow, max_shadow, min_snapshot, max_snapshot; + struct vcpu *v; ASSERT(shadow_lock_is_acquired(d)); @@ -1739,6 +1740,9 @@ static int resync_all(struct domain *d, u32 stype) if ( unlikely(unshadow) ) { + for_each_vcpu(d, v) + if(smfn == pagetable_get_pfn(v->arch.shadow_table)) + return need_flush; perfc_incrc(unshadow_l2_count); shadow_unpin(smfn); #if CONFIG_PAGING_LEVELS == 2 diff --git a/xen/arch/x86/shadow32.c b/xen/arch/x86/shadow32.c index 298fdb1a5d..7d517ec390 100644 --- a/xen/arch/x86/shadow32.c +++ b/xen/arch/x86/shadow32.c @@ -2326,6 +2326,7 @@ static int resync_all(struct domain *d, u32 stype) int changed; u32 min_max_shadow, min_max_snapshot; int min_shadow, max_shadow, min_snapshot, max_snapshot; + struct vcpu *v; ASSERT(shadow_lock_is_acquired(d)); @@ -2527,6 +2528,9 @@ static int resync_all(struct domain *d, u32 stype) if ( unlikely(unshadow) ) { + for_each_vcpu(d, v) + if(smfn == pagetable_get_pfn(v->arch.shadow_table)) + return need_flush; perfc_incrc(unshadow_l2_count); shadow_unpin(smfn); if ( unlikely(shadow_mode_external(d)) ) -- 2.30.2